namespace BlogsAPI.OneBlog
{
    using System.IO;
    using System.Text.RegularExpressions;
    using Sites;
    using Interfaces;
    using System.Diagnostics;
    using System;
    using System.Text;
    using System.Net;

    /// <summary>
    /// Интерфейс взаимодействия с блогом Леонида Каганова
    /// </summary>
    ///<copyright>
    ///Topbot (c) http://ya.topbloger.ru, 2008
    ///</copyright>
    [Obsolete("lleo.aha.ru давно забанен и переехал")]
    [SingleBlog(HostName = "lleo.aha.ru")]
    public class Lleo : StandAlone, IOpenIdLogin
    {
        readonly static Regex comms = new Regex(@"<a\s+name\W+c\d+\W+", Regexoptions);
        readonly static Regex rLleo = new Regex(@"<div\W+id\W+header[^a-z>]+[^>]*>([^<]+)<.*<div\W+id\W+body[^a-z>]+[^>]*>(.*?)</div>", Regexoptions);

        #region OpenID
        /// <summary>
        /// Залогинится на ллео
        /// </summary>
        /// <returns>Возвращает текст ошибки</returns>
        public Boolean OpenIdLogin(UserOpenID user)
        {
            try
            {
                string openid = Common.DelHttp(user.OpenIdServer.GetBlogLink(user.username));
                HttpWebRequest myHttpWebRequest = MakeRequest("http://lleo.aha.ru/dnevnik/logon");
                myHttpWebRequest.Method = "POST";
                myHttpWebRequest.AllowAutoRedirect = false;
                myHttpWebRequest.Referer = "http://lleo.aha.ru";
                myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
                // передаем параметры
                string sQueryString =
                    String.Format("openid_url={0}&action=%C7%E0%EB%EE%E3%E8%ED%E8%F2%FC%F1%FF+%EF%EE+OpenID",
                                  openid);
                //***************//
                byte[] byteArr = Encoding.GetEncoding(1251).GetBytes(sQueryString);
                myHttpWebRequest.ContentLength = byteArr.Length;
                myHttpWebRequest.GetRequestStream().Write(byteArr, 0, byteArr.Length);
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                //получаем ответ
                //string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251)).ReadToEnd();
                myHttpWebResponse.Close();
                if (!String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]))
                {
                    CookieParse(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]);
                }
                if (!String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.Location]))
                {
                    myHttpWebRequest =
                        MakeRequest(user.OpenIdServer.GrantOpenID(myHttpWebResponse.Headers[HttpResponseHeader.Location], user));
                    myHttpWebRequest.AllowAutoRedirect = false;
                    myHttpWebRequest.Referer = "http://lleo.aha.ru";
                    myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    //result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251)).ReadToEnd();
                    myHttpWebResponse.Close();
                    if (!String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]))
                    {
                        sCookie += "; " + CookieParse(myHttpWebResponse.Headers[HttpResponseHeader.SetCookie]);
                        return sCookie.Contains(openid);
                    }
                }
            }
            catch (Exception e1)
            {
                Debug.WriteLine("Login:Lleo.aha.ru:" + e1.Message);
            }
            return false;
        }

        /// <summary>
        /// Оставить комментарий от имени пользователя
        /// </summary>
        /// <param name="user">Аккаунт OpenID</param>
        /// <param name="cp">Текст комментария</param>
        /// <returns>Возвращает текст ошибки</returns>
        public PostResult OpenIDComment(UserOpenID user, CommentPost cp)
        {
            var ps = new PostResult { Error = new NotImplementedException() };
            try
            {
                if (!ValidateLink(cp.Link.OriginalString))
                {
                    throw new Exception("Cant comment on " + cp.Link.OriginalString);
                }
                //при залогинивании заодно определиться номер пользователя
                if (!OpenIdLogin(user))
                {
                    throw new Exception("Lleo.aha.ru: не удалось залогинится");
                }
                //теперь комментируемс...
                HttpWebRequest myHttpWebRequest = MakeRequest(cp.Link.OriginalString + "#new_comment");
                myHttpWebRequest.Method = "POST";
                myHttpWebRequest.AllowAutoRedirect = false;
                myHttpWebRequest.Referer = cp.Link.OriginalString;
                myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
                // передаем параметры
                string sQueryString =
                    String.Format("Address=nospam@ya.ru&action=add_commentary&Commentary={0}&submit=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D0%BA%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B9",
                    cp.Body);
                //***************//
                byte[] byteArr = Encoding.GetEncoding(1251).GetBytes(sQueryString);
                myHttpWebRequest.ContentLength = byteArr.Length;
                myHttpWebRequest.GetRequestStream().Write(byteArr, 0, byteArr.Length);
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                //string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251)).ReadToEnd();
                myHttpWebResponse.Close();
                cp.Existance = !String.IsNullOrEmpty(myHttpWebResponse.Headers[HttpResponseHeader.Location]);
                if (cp.Existance)
                {
                    ps.Error = null;
                    ps.sLink = new Uri(cp.Link.OriginalString + myHttpWebResponse.Headers[HttpResponseHeader.Location].Substring(
                            myHttpWebResponse.Headers[HttpResponseHeader.Location].IndexOf('?')));
                }
            }
            catch (Exception we)
            {
                Log("MakeCommentByOpenId Lleo.aha.ru: " + we.Message);
                ps.Error = we;
            }
            //
            return ps;
        }

        #endregion

        /// <summary>
        /// 
        /// </summary>
        /// <param name="bp">Пост для которого считаем комменты</param>
        /// <returns>Число комментариев к посту</returns>
        public override int HowManyComments(BlogPost bp)
        {
            int iRet = 0;
            try
            {
                HttpWebRequest myHttpWebRequest = MakeRequest(bp.Link.OriginalString);
                myHttpWebRequest.Method = "GET";
                myHttpWebRequest.AllowAutoRedirect = false;
                myHttpWebRequest.Referer = "http://lleo.aha.ru";
                HttpWebResponse resp = (HttpWebResponse)myHttpWebRequest.GetResponse();
                string response = new StreamReader(resp.GetResponseStream()).ReadToEnd();
                //считаем число комментариев
                iRet = comms.Matches(response).Count;
                //закроем поток(!)
                resp.Close();
            }
            catch (Exception e1)
            {
                Log("Lleo GetCommentsCount failed: " + e1.Message);
            }
            return iRet;
        }

        /// <summary>
        /// Получение одного поста по ссылке на него и данных о пользователе
        /// </summary>
        /// <param name="linkOnPost">ссылка на пост</param>
        /// <param name="userName">имя пользователя</param>
        /// <param name="btype">тип блогплатформы</param>
        /// <remarks>Может генерить исключения</remarks>
        public override BlogPost GetOnePost(string linkOnPost, string userName, BlogType btype)
        {
            BlogPost bpRet = null;
            //making post here
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(linkOnPost);
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            //получаем ответ
            string result = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251)).ReadToEnd();
            myHttpWebResponse.Close();
            Match m = rLleo.Match(result);
            if (m.Success)
            {
                //создаем объект и заполняем его
                bpRet = new BlogPost(new Uri(Common.FixHttp(linkOnPost)))
                {
                    Body = m.Groups[2].Value.Replace("<p>", ""),
                    Subject = m.Groups[1].Value,
                    Existance = true
                };
            }
            return bpRet;
        }
    }
}